RDS Proxyの接続数に関するメトリクスについて理解しよう
CX事業本部@大阪の岩田です。
先日社内のSlackでRDS ProxyのメトリクスDatabaseConnectionsCurrentlyBorrowed
の意味について質問を受けました。せっかくなので、その時の回答内容を整理しつつ改めてブログでもご紹介します。
RDS Proxyの各種メトリクス
RDS ProxyはCloudWatchに各種のメトリクスを発行しており、これらのメトリクスを分析することでRDS Proxyの利用状況を正しく把握することができます。今回は以下5つのメトリクスについてご紹介します。
- DatabaseConnections
- ClientConnections
- DatabaseConnectionsCurrentlyBorrowed
- DatabaseConnectionsCurrentlySessionPinned
- DatabaseConnectionsCurrentlyInTransaction
これら5つのメトリクスの関連性を図にすると以下のようなイメージになります。
1つずつ説明していきます。
DatabaseConnections
このメトリクスはRDS Proxy ↔ RDS間の接続数を表すメトリクスです。RDS Proxyの用語で言い換えると、「基となるデータベース接続」の合計値とも言えます。
公式ドキュメントでは以下のように記載されています
The current number of database connections.
日本語訳は
現在のデータベース接続の数
です。
RDS Proxyは
max_connections等のパラメータで指定されたRDSの最大同時接続数 × 接続プールの最大接続数(MaxConnectionsPercent)で指定した割合
で計算された接続数を上限としてRDSとの接続を確立します。
例えばmax_connectionsが1,000で接続プールの最大接続数が95%の場合、RDS Proxy ↔ RDS間の接続数は最大で950となります。このケースだとDatabaseConnectionsは常に950以下の値になります。
ClientConnections
このメトリクスはクライアント ↔ RDS Proxy間の接続数を表すメトリクスです。単にクライアントがRDS Proxyに接続しているだけの状態ではRDS Proxy ↔ RDS間の接続を消費する必要が無いため、RDSの接続数を無駄に消費せずに済むのがRDS Proxyのメリットです。
公式ドキュメントでは以下のように記載されています
The current number of client connections. This metric is reported every minute.
日本語訳は以下
現在のクライアント接続の数
DatabaseConnectionsCurrentlyBorrowed
このメトリクスはRDS Proxyに接続しているクライントの要求を処理するために、接続プールから「借用」されている状態のRDS Proxy ↔ RDS間の接続数です。「借用」はコネクションプーリングに関する文脈ではチェックアウトという言い方も一般的だと思います。
公式ドキュメントでは以下のように記載されています
The current number of database connections in the borrow state.
日本語訳は以下
借用状態のデータベース接続の現在の数
このメトリクスが計上される状態としては以下のようなケースがあります
- クライアントから発行されたSQLをRDSまで中継している状態
- SET文等の実行によってピン留め(固定)が発生している状態
- 後述するDatabaseConnectionsCurrentlySessionPinned状態
- クライアントがトランザクションを実行している状態
- 後述するDatabaseConnectionsCurrentlyInTransaction状態
DatabaseConnectionsCurrentlySessionPinned
クライアントが特定の操作を行った場合に対象のクライアント ↔ RDS Proxy間のセッションが終了するまでの間、借用状態の「基となるデータベース接続」は接続プールに返却されず、借用状態を維持し続けます。この状態がピン留め(固定)と呼ばれる状態で、DatabaseConnectionsCurrentlySessionPinnedはピン留め(固定)の発生によって計上されます。
公式ドキュメントでは以下のように記載されています
The current number of database connections currently pinned because of operations in client requests that change session state.
日本語訳は以下
セッション状態を変更するクライアントリクエストのオペレーションのために現在固定されているデータベース接続の数
常にDatabaseConnectionsCurrentlySessionPinned ≦ DatabaseConnectionsCurrentlyBorrowedの関係が成立します
DatabaseConnectionsCurrentlyInTransaction
クライアントがトランザクション実行中の場合は、トランザクションがコミット/ロールバックされるまで借用状態の「基となるデータベース接続」は接続プールに返却されず、借用状態を維持し続けます。このメトリクスはトランザクションの実行によって「基となるデータベース接続」が借用状態に遷移した場合に計上されます。
公式ドキュメントでは以下のように記載されています
The current number of database connections in a transaction.
日本語訳は以下
トランザクションでの現在のデータベース接続の数
常にDatabaseConnectionsCurrentlyInTransaction ≦ DatabaseConnectionsCurrentlyBorrowedの関係が成立します
まとめ
RDS Proxyの各種メトリクスについて解説しました。これらのメトリクスの意味を正しく理解することで、システムの裏側で何が起こっているのか?RDSをスケールアップすべきなのか?アプリの実装に問題は無いのか?といったことを正しく分析できるようになります。RDS Proxyを運用されている方の参考になれば幸いです。